package com.itheima.wemedia.service.impl;

import com.alibaba.cloud.commons.lang.StringUtils;
import com.alibaba.fastjson.JSON;
import com.itheima.admin.fagin.AdChannelFagin;
import com.itheima.admin.pojo.AdChannel;
import com.itheima.common.constants.SystemConstants;
import com.itheima.common.exception.LeadNewsException;
import com.itheima.common.vo.ResultVo;
import com.itheima.wemedia.service.AdChannelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AdChannelServiceImpl implements AdChannelService {
    //注入远程调用的对象
    @Autowired
    private AdChannelFagin adChannelFagin;
    //注入redis对象
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    /**
     * 远程调用查询频道数据
     * @return 返回查询到的频道数据
     */
    @Override
    public ResultVo findChannel() {
        //先从redis中获取是否有这个数据
        String redis = stringRedisTemplate.opsForValue().get(SystemConstants.REDISKEY_CHANNELLIST);
        if (StringUtils.isNotEmpty(redis)){
            //表示从redis中获取到了数据，将获取的Json数据转换为对象
            List<AdChannel> list = JSON.parseArray(redis, AdChannel.class);
            //将获取到的list集合，返回即可
            return ResultVo.ok(list);
        }
        //redis中没有数据则需要远程调用admin微服务进行查询操作
        ResultVo<List<AdChannel>> resultVo = adChannelFagin.findChannel();
        //判断是否查询成功
        if (!resultVo.isSuccess()) {
            throw new LeadNewsException("远程调用admin微服务查询频道列表失败");
        }
        //进入这里就表示查询数据成功，获取查询到的频道数据
        List<AdChannel> data = resultVo.getData();
        //将获取到的数据存入redis数据库中，进行缓存
        stringRedisTemplate.opsForValue().set(SystemConstants.REDISKEY_CHANNELLIST,JSON.toJSONString(data));
        //返回查询到的频道数据
        return ResultVo.ok(data);
    }
}
